home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1993 / Internet Info CD-ROM (Walnut Creek) (1993).iso / networking / terms / tipx / login.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-01  |  4.9 KB  |  297 lines

  1. #include "tip.h"
  2. #include <sys/time.h>
  3.  
  4. static FILE *fp;
  5. static int line;
  6.  
  7. char *dosend();
  8. char *dorecv();
  9. int naptimeout();
  10.  
  11. char *
  12. login()
  13. {
  14.     static char errmsg[128];
  15.     char buf[512];
  16.     char cmd[32], fmt[80];
  17.     char arg1[128],arg2[128];
  18.     register char *cp;
  19.     int n;
  20.  
  21.     if (LS == NOSTR)
  22.         return(0);
  23.     if ((fp = fopen(LS, "r")) == NULL) {
  24.         perror(LS);
  25.         return("cannot open login script");
  26.     }
  27.  
  28.     line = 0;
  29.     (void) sprintf(fmt, "%%%ds%%*[ \t]%%%ds%%*[ \t]%%%ds\\n",
  30.                 (sizeof cmd)-1, (sizeof arg1)-1, (sizeof arg2)-1);
  31.     while(fgets(buf, sizeof(buf), fp) != NULL)  {
  32.         line++;
  33.         if (isblank(buf))
  34.             continue;
  35.         if ((n = sscanf(buf, fmt, cmd, arg1, arg2)) <= 0)
  36.             goto err;
  37.         else if (cmd[0] == '#')
  38.             continue;
  39.         else if (equal(cmd, "done"))
  40.             return(0);
  41.         else if (equal(cmd, "fail"))
  42.             return("login failed");
  43.         else if(equal(cmd, "send") && n == 2) {
  44.             if (cp = dosend(arg1))
  45.                 return(cp);
  46.         } else if(equal(cmd, "recv") && n == 3) {
  47.             if (cp = dorecv(arg1, arg2))
  48.                 return(cp);
  49.         } else if(equal(cmd, "label"))
  50.             continue;
  51.         else if(equal(cmd, "goto") && n == 2) {
  52.             if (dogoto(arg1))
  53.                 goto err;
  54.         } else
  55.             goto err;
  56.     }
  57.     if(ferror(fp)) {
  58.         perror(LS);
  59.         return("error reading script file");
  60.     }
  61.     return("premature EOF in script file");
  62.  
  63. err:    sprintf(errmsg, "format error in %.80s at line %d", LS, line);
  64.     return(errmsg);
  65. }
  66.  
  67. char *
  68. dosend(cp)
  69. char *cp;
  70. {
  71.     char c;
  72.  
  73.     if(vflag)
  74.         fprintf(stderr, "send: %s: ", cp);
  75.     while(*cp) {
  76.         c = *cp++;
  77.         if (c == '\\') {
  78.             switch(*cp) {
  79.             case 0:
  80.                 return("send format error");
  81.             case 'b':
  82.                 c = '\b'; cp++; break;
  83.             case 'd':
  84.                 sleep(1); cp++;
  85.                 continue;
  86.             case 'f':
  87.                 c = '\f'; cp++; break;
  88.             case 'n':
  89.                 c = '\n'; cp++; break;
  90.             case 'r':
  91.                 c = '\r'; cp++; break;
  92.             case 's':
  93.                 c = ' '; cp++; break;
  94.             case 't':
  95.                 c = '\t'; cp++; break;
  96.             case 'x':
  97.                 genbrk(); cp++;
  98.                 continue;
  99.             case '?':
  100.                 c = 0177; cp++; break;
  101.             default:
  102.                 c = octalnum(&cp);
  103.             }
  104.         }
  105.         if (write(FD, &c, 1) != 1)
  106.             return("write error to remote site");
  107.         if (vflag)
  108.             show(&c, 1);
  109.         nap(20);
  110.     }
  111.     if (vflag)
  112.         putc('\n', stderr);
  113.     return(0);
  114.     
  115. }
  116.  
  117. nap(ms)
  118. int ms;
  119. {
  120.     struct itimerval itv;
  121.  
  122.     signal(SIGALRM, naptimeout);
  123.     itv.it_interval.tv_sec = 0;
  124.     itv.it_interval.tv_usec = 0;
  125.     itv.it_value.tv_sec = 0;
  126.     itv.it_value.tv_usec = ms*1000;
  127.     setitimer(ITIMER_REAL, &itv, (struct itimerval *)0);
  128.     sigpause(0);
  129. }
  130.  
  131. naptimeout()
  132. {
  133.     return(0);
  134. }
  135.  
  136. jmp_buf jmpbuf;
  137. sigfunc_t recvtimeout();
  138.  
  139. char *
  140. dorecv(control, want)
  141. char *control, *want;
  142. {
  143.     char buf[128];
  144.     char *label;
  145.     int secs = atoi(control);
  146.     int i, n, size;
  147.     
  148.     if (label = strchr(control, '/'))
  149.         label++;
  150.     if (setjmp(jmpbuf)) {
  151.         if(vflag)
  152.             fprintf(stderr, "\nrecv: timeout, going to %s\n", label);
  153.         dogoto(label);
  154.         return(0);
  155.     }
  156.     signal(SIGALRM, recvtimeout);
  157.     alarm(secs);
  158.     strfix(want);
  159.     size = strlen(want);
  160.     if(vflag)
  161.         fprintf(stderr, "recv (want %s): ", want);
  162.     for (i = 0; i < size; ) {
  163.         if ((n = read(FD, &buf[i], size - i)) <= 0)
  164.             goto readerror;
  165.         if(vflag)
  166.             show(&buf[i], n);
  167.         i += n;
  168.     }
  169.     for (i = 0; i < size; i++)
  170.         buf[i] &= 0177;
  171.     i = size-1;
  172.     while (strncmp(buf, want, size)) {
  173.         for (n = 0; n < i; n++)
  174.             buf[n] = buf[n+1];
  175.         if ((n = read(FD, &buf[i], 1)) != 1)
  176.             goto readerror;
  177.         buf[i] &= 0177;
  178.         if(vflag)
  179.             show(&buf[i], 1);
  180.     }
  181.     alarm(0);
  182.     if (vflag)
  183.         putc('\n', stderr);
  184.     return(0);
  185. readerror:
  186.     alarm(0);
  187.     return("read error from remote");
  188. }
  189.  
  190. strfix(cp)
  191. char *cp;
  192. {
  193.     char c;
  194.     char *np = cp;
  195.  
  196.     while(*cp) {
  197.         c = *cp++;
  198.         if (c == '\\') {
  199.             switch(*cp) {
  200.             case 'b':
  201.                 c = '\b'; cp++; break;
  202.             case 'f':
  203.                 c = '\f'; cp++; break;
  204.             case 'n':
  205.                 c = '\n'; cp++; break;
  206.             case 'r':
  207.                 c = '\r'; cp++; break;
  208.             case 's':
  209.                 c = ' '; cp++; break;
  210.             case 't':
  211.                 c = '\t'; cp++; break;
  212.             case '?':
  213.                 c = 0177; cp++; break;
  214.             default:
  215.                 c = octalnum(&cp);
  216.             }
  217.         }
  218.         *np++ = c; 
  219.     }
  220.     *np = 0;
  221. }
  222.  
  223. #define isoctal(c) ((c) >= '0' && (c) <= '7')
  224.  
  225. octalnum(cpp)
  226. char **cpp;
  227. {
  228.     int n = 0;
  229.     char c = *((*cpp)++);
  230.  
  231.     if (isoctal(c)) {
  232.         n = (c-'0');
  233.         c = *((*cpp)++);
  234.         if (isoctal(c)) {
  235.             n = (n<<3)+(c-'0');
  236.             c = *((*cpp)++);
  237.             if (isoctal(c))
  238.                 n = (n<<3)+(c-'0');
  239.         }
  240.         c = n;
  241.     }
  242.     return(c);
  243. }
  244.  
  245. show(cp, n)
  246. char *cp;
  247. {
  248.     register int i;
  249.     char c;
  250.  
  251.     for(i = 0; i < n; i++) {
  252.         c = cp[i]&0177;
  253.         if(isprint(c))
  254.             fputc(c, stderr);
  255.         else
  256.             fprintf(stderr, "\\%03o", c);
  257.     }
  258. }
  259.  
  260. sigfunc_t
  261. recvtimeout()
  262. {
  263.     longjmp(jmpbuf, 1);
  264.     return;
  265. }
  266.  
  267. dogoto(label)
  268. char *label;
  269. {            
  270.     char buf[512];
  271.     char fmt[80], cmd[32], arg1[128];
  272.     int n;
  273.  
  274.     if(vflag)
  275.         fprintf(stderr, "goto: %s\n", label);
  276.     rewind(fp);
  277.     line = 0;
  278.     (void) sprintf(fmt, "%%%ds%%*[ \t]%%%ds\\n",
  279.                 (sizeof cmd)-1, (sizeof arg1)-1);
  280.     while(fgets(buf, sizeof(buf), fp) != NULL) {
  281.         line++;
  282.         if (buf[0] == '#' || isblank(buf))
  283.             continue;
  284.         n = sscanf(buf, fmt, cmd, arg1);
  285.         if(n == 2 && equal(cmd, "label") && equal(arg1, label))
  286.             break;
  287.     }
  288.     return(feof(fp) || ferror(fp));
  289. }
  290.  
  291. isblank(s)
  292. char *s;
  293. {
  294.     while(isspace(*s)) s++;
  295.     return(*s == '\0');
  296. }
  297.